export namespace Annotation {
  export type Prototype = { constructor: IFunc } & any
  export type Ctor<Cls extends any = any> = { new(...args: any[]): Cls };
  export interface IFunc {
    <T = any>(target: Prototype, propKey: string, descriptor: TypedPropertyDescriptor<T>): void;
  }
  export type IFuncParameters = Parameters<IFunc>
  export interface ICls<T extends Ctor = Ctor> {
    (constructor: T): T;
  }
  export interface IProp {
    (target: Prototype, propKey: string): void;
  }
  export interface IArg {
    (target: Prototype, propKey: string, paramIdx: number): void;
  }
  export interface IArgOrProps {
    (target: Prototype, propKey: string, paramIdx?: number): void;
  }
  export interface IProp {
    (target: Prototype, propKey: string): void;
  }
}